package br.unp.tasi.loja.controladores.admin;

import br.unp.tasi.loja.entidades.Produto;
import br.unp.tasi.loja.repositorios.RepositorioCategoria;
import br.unp.tasi.loja.repositorios.RepositorioProduto;
import java.util.List;
import javax.inject.Inject;
import javax.servlet.http.HttpSession;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;

/**
 * Controlador de Produtos
 * @author jfrank
 */
@Controller
@RequestMapping("/admin/produtos")
public class ControladorAdminProduto extends ControladorAdminBasico {

  @Inject
  RepositorioProduto repositorioProduto;
  @Inject
  RepositorioCategoria repositorioCategoria;

  /**
   * Listar as Produtos
   * @param modelo
   * @return
   */
  @RequestMapping(value = "/listar", method = RequestMethod.GET)
  public String listar(Model modelo, HttpSession sessao) {
    if (!isAdministrador(sessao)) {
      return "redirect:/usuario/loginform.do";
    }

    List<Produto> produtos = repositorioProduto.localizarTodos();
    modelo.addAttribute("produtos", produtos);
    return "produto/listar";
  }

  /**
   * Editar um Produto existente pelo id
   * @param modelo
   * @param id
   * @return
   */
  @RequestMapping(value = "/editar", method = RequestMethod.GET)
  public String editar(Model modelo, @RequestParam("id") Long id) {
    Produto produto = repositorioProduto.localizarPeloID(id);
    modelo.addAttribute("produto", produto);
    modelo.addAttribute("categorias", repositorioCategoria.localizarTodos());
    return "produto/editar";
  }

  /**
   * Exibir formulario para uma novo Produto
   * @param modelo
   * @return
   */
  @RequestMapping(value = "/novo", method = RequestMethod.GET)
  public String novo(Model modelo) {
    Produto produto = new Produto();
    modelo.addAttribute("produto", produto);
    modelo.addAttribute("categorias", repositorioCategoria.localizarTodos());
    return "produto/novo";
  }

  /**
   * Persistir um Produto
   * @param Produto
   * @param modelo
   * @return
   */
  @RequestMapping(value = "/atualizar", method = RequestMethod.POST)
  public String atualizar(FormProduto formProduto, Model modelo) {

    Produto produto = new Produto();
    produto.setId(formProduto.getId());
    atribuirValoresFormulario(produto, formProduto);
    repositorioProduto.atualizar(produto);
    return "redirect:/admin/produtos/listar.do";
  }

  /**
   * Persistir um Produto
   * @param Produto
   * @param modelo
   * @return
   */
  @RequestMapping(value = "/gravar", method = RequestMethod.POST)
  public String gravar(FormProduto formProduto, Model modelo) {

    Produto produto = new Produto();
    atribuirValoresFormulario(produto, formProduto);
    repositorioProduto.gravar(produto);
    return "redirect:/admin/produtos/listar.do";
  }

  private void atribuirValoresFormulario(Produto produto, FormProduto formProduto) {
    produto.setNome(formProduto.getNome());
    produto.setDescricao(formProduto.getDescricao());
    produto.setCategoria(repositorioCategoria.localizarPeloID(formProduto.getCategoria()));
    produto.setPreco(formProduto.getPreco());
    produto.setEmoferta(formProduto.isEmoferta());
    produto.setUnidadesemestoque(formProduto.getUnidadesemestoque());
    produto.setTemimagem(formProduto.isTemimagem());
  }

  /**
   * Apagar um produto existente pelo id
   * @param modelo
   * @param id
   * @return
   */
  @RequestMapping(value = "/apagar", method = RequestMethod.GET)
  public String apagar(Model modelo, @RequestParam("id") Long id) {
    repositorioProduto.apagarPeloID(id);
    return "redirect:/admin/produtos/listar.do";
  }
}
